package br.com.foxinline.servico.ep;

import br.com.foxinline.enums.TipoPessoa;
import br.com.foxinline.modelo.Anexo;
import br.com.foxinline.modelo.ep.Escritura;
import br.com.foxinline.modelo.ep.Parte;
import br.com.foxinline.modelo.ep.SeloEP;
import br.com.foxinline.servico.ServicoGenerico;
import br.com.foxinline.utilitario.Caracteres;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.ejb.Stateless;
import javax.persistence.Query;

/**
 *
 * @author cadomeireles
 */
@Stateless
public class EscrituraServico extends ServicoGenerico<Escritura> {

    public EscrituraServico() {
        super(Escritura.class);
    }

    @Override
    public void deletar(Escritura escritura) {
        escritura.setAtivo(false);
        super.atualizar(escritura);
    }

    public List<Parte> obterPartes(Escritura escritura) {

        String sql = "select escritura.partes from Escritura escritura where escritura.ativo = true and escritura = :escritura";

        Query query = getEntityManager().createQuery(sql);

        if (escritura != null && escritura.getId() != null) {
            query.setParameter("escritura", escritura);
        }

        return query.getResultList();
    }

    public List<SeloEP> obterSelos(Escritura escritura) {

        String sql = "select escritura.selosEP from Escritura escritura where escritura.ativo = true and escritura = :escritura";

        Query query = getEntityManager().createQuery(sql);

        if (escritura != null && escritura.getId() != null) {
            query.setParameter("escritura", escritura);
        }

        return query.getResultList();
    }

    public List<Anexo> obterAnexos(Escritura escritura) {
        String sql = "select escritura.anexos from Escritura escritura where escritura.ativo = true and escritura = :escritura";

        Query query = getEntityManager().createQuery(sql);

        if (escritura.getId() != null) {
            query.setParameter("escritura", escritura);
        }

        return query.getResultList();
    }

    public List<Escritura> pesquisar(Escritura escritura, Parte parte) {
        String sql = "select escritura from Escritura escritura";

        boolean tipoPessoa = false;

        if (parte.getPessoa().getNome() != null && !parte.getPessoa().getNome().isEmpty()
                || parte.getPessoa().getCpf() != null && !parte.getPessoa().getCpf().isEmpty()
                || parte.getPessoa().getCnpj() != null && !parte.getPessoa().getCnpj().isEmpty()
                || parte.getQualidade() != null) {
            sql += " join escritura.partes partes where partes.pessoa.tipoPessoa = :tipoPessoa and escritura.ativo = true";
            tipoPessoa = true;
        } else {
            sql += " where escritura.ativo = true";
        }

        if (parte.getPessoa().getNome() != null && !parte.getPessoa().getNome().isEmpty()) {
            sql += " and lower(partes.pessoa.nome) like '%" + parte.getPessoa().getNome().toLowerCase() + "%'";
        }

        if (parte.getPessoa().getCpf() != null && !parte.getPessoa().getCpf().isEmpty()) {
            sql += " and partes.pessoa.cpf like '%" + Caracteres.removecaracter(parte.getPessoa().getCpf()) + "%'";
        }

        if (parte.getPessoa().getCnpj() != null && !parte.getPessoa().getCnpj().isEmpty()) {
            sql += " and partes.pessoa.cnpj like '%" + Caracteres.removecaracter(parte.getPessoa().getCnpj()) + "%'";
        }

        if (parte.getQualidade() != null) {
            sql += " and partes.qualidade = :qualidade";
        }

        if (escritura.getNumero() != null && !escritura.getNumero().isEmpty()) {
            sql += " and escritura.numero like '%" + escritura.getNumero() + "%'";
        }

        if (escritura.getAtoTipoEP() != null) {
            sql += " and escritura.atoTipoEP = :tipo";
        }

        if (escritura.getNaturezaEscritura() != null) {
            sql += " and escritura.naturezaEscritura = :natureza";
        }

        if (escritura.getDataAto() != null) {
            sql += " and escritura.dataAto = :data";
        }

        if (escritura.getValor() != null) {
            sql += " and escritura.valor = :valor";
        }

        if (escritura.getLivro() != null && !escritura.getLivro().isEmpty()) {
            sql += " and escritura.livro like '%" + escritura.getLivro() + "%'";
        }

        if (escritura.getLivroComplemento() != null && !escritura.getLivroComplemento().isEmpty()) {
            sql += " and escritura.livroComplemento like '%" + escritura.getLivroComplemento() + "%'";
        }

        if (escritura.getFolha() != null && !escritura.getFolha().isEmpty()) {
            sql += " and escritura.folha like '%" + escritura.getFolha() + "%'";
        }

        if (escritura.getFolhaComplemento() != null && !escritura.getFolhaComplemento().isEmpty()) {
            sql += " and escritura.folhaComplemento like '%" + escritura.getFolhaComplemento() + "%'";
        }

        Query query = getEntityManager().createQuery(sql);

        if (escritura.getAtoTipoEP() != null) {
            query.setParameter("tipo", escritura.getAtoTipoEP());
        }

        if (escritura.getNaturezaEscritura() != null) {
            query.setParameter("natureza", escritura.getNaturezaEscritura());
        }

        if (escritura.getDataAto() != null) {
            query.setParameter("data", escritura.getDataAto());
        }

        if (escritura.getValor() != null) {
            query.setParameter("valor", escritura.getValor());
        }

        if (parte.getQualidade() != null) {
            query.setParameter("qualidade", parte.getQualidade());
        }

        if (tipoPessoa) {
            query.setParameter("tipoPessoa", parte.getPessoa().getTipoPessoa());
        }

        return query.getResultList();
    }

    public List<Escritura> obterEscrituras(Date dataInicial, Date dataFinal) {
        String sql = "select escritura from Escritura escritura where escritura.ativo = true and escritura.dataCadastro between :dataInicial and :dataFinal";

        Query query = getEntityManager().createQuery(sql);

        query.setParameter("dataInicial", dataInicial);
        query.setParameter("dataFinal", dataFinal);

        return query.getResultList();
    }

    public void exportarCENSEC(Date dataInicial, Date dataFinal) throws IOException {

        BufferedReader reader = new BufferedReader(new FileReader("/home/cadomeireles/Development/FoxInLine/projects/Notario/Notario-ejb/src/java/br/com/foxinline/utilitario/CEP_layout.xml"));

        DateFormat fileNameDateFormat = new SimpleDateFormat("dd-MM-yyyy");
        
        List<Escritura> escrituras = obterEscrituras(dataInicial, dataFinal);

        String fileName = String.format("CENSEC_CEP_%s_%s_(%s).xml", fileNameDateFormat.format(dataInicial), fileNameDateFormat.format(dataFinal), escrituras.size());

        BufferedWriter file = new BufferedWriter(new FileWriter(new File("/home/cadomeireles/Development/FoxInLine/Docs/Notário/CENSEC/" + fileName)));

        String line;

        while ((line = reader.readLine()) != null) {
            file.write(line + "\n");
        }

        StringBuilder texto = new StringBuilder();

        DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");

        Pattern pattern = Pattern.compile("(\\D*$)");

        for (Escritura escritura : escrituras) {
            texto.append("\t<AtoCep>\n");

            texto.append("\t\t<TipoAtoCep>").append(escritura.getAtoTipoEP().getCodigo()).append("</TipoAtoCep>\n");

            String naturezaEscritura = "";

            if (escritura.getNaturezaEscritura().getCodigo() != null) {
                naturezaEscritura = escritura.getNaturezaEscritura().getCodigo();
            }

            texto.append("\t\t<NaturezaEscritura>").append(naturezaEscritura).append("</NaturezaEscritura>\n");

            texto.append("\t\t<DataAto>").append(dateFormat.format(escritura.getDataAto())).append("</DataAto>\n");

            texto.append("\t\t<Livro>").append(escritura.getLivro()).append("</Livro>\n");

            Matcher matcherLivroComplemento = pattern.matcher(escritura.getLivroComplemento());
            String livroComplemento = "";
            if (matcherLivroComplemento.find()) {
                livroComplemento = matcherLivroComplemento.group();
            }

            texto.append("\t\t<LivroComplemento>").append(livroComplemento).append("</LivroComplemento>\n");

            texto.append("\t\t<Folha>").append(escritura.getFolha()).append("</Folha>\n");

            Matcher matcherFolhaComplemento = pattern.matcher(escritura.getFolhaComplemento());
            String folhaComplemento = "";
            if (matcherFolhaComplemento.find()) {
                folhaComplemento = matcherFolhaComplemento.group();
            }

            texto.append("\t\t<FolhaComplemento>").append(folhaComplemento).append("</FolhaComplemento>\n");

            texto.append("\t\t<Valor>").append(escritura.getValor()).append("</Valor>\n");

            String desconhecido = "";
            if (escritura.getDesconhecido() != null && !escritura.getDesconhecido().isEmpty()) {
                desconhecido = escritura.getDesconhecido();
            }

            texto.append("\t\t<Desconhecido>").append(desconhecido).append("</Desconhecido>\n");

            String livroReferente = "";
            if (escritura.getLivroReferente() != null && !escritura.getLivroReferente().isEmpty()) {
                livroReferente = escritura.getLivroReferente();
            }

            texto.append("\t\t<ReferenteLivro>").append(livroReferente).append("</ReferenteLivro>\n");

            String livroReferenteComplemento = "";
            if (escritura.getLivroReferenteComplemento() != null && !escritura.getLivroReferenteComplemento().isEmpty()) {
                Matcher matcherLivroReferenteComplemento = pattern.matcher(escritura.getLivroReferenteComplemento());
                if (matcherLivroReferenteComplemento.find()) {
                    livroReferenteComplemento = matcherLivroReferenteComplemento.group();
                }
            }

            texto.append("\t\t<ReferenteLivroComplemento>").append(livroReferenteComplemento).append("</ReferenteLivroComplemento>\n");

            String folhaReferente = "";
            if (escritura.getFolhaReferente() != null && !escritura.getFolhaReferente().isEmpty()) {
                folhaReferente = escritura.getFolhaReferente();
            }

            texto.append("\t\t<ReferenteFolha>").append(folhaReferente).append("</ReferenteFolha>\n");

            String folhaReferenteComplemento = "";
            if (escritura.getFolhaReferenteComplemento() != null && !escritura.getFolhaReferenteComplemento().isEmpty()) {
                Matcher matcherFolhaReferenteComplemento = pattern.matcher(escritura.getFolhaReferenteComplemento());
                if (matcherFolhaReferenteComplemento.find()) {
                    folhaReferenteComplemento = matcherFolhaReferenteComplemento.group();
                }
            }

            texto.append("\t\t<ReferenteFolhaComplemento>").append(folhaReferenteComplemento).append("</ReferenteFolhaComplemento>\n");

            String cidadeReferente = "";
            String estadoReferente = "";

            if (escritura.getCidadeReferente() != null) {
                cidadeReferente = escritura.getCidadeReferente().getCodigoIbge();
                estadoReferente = escritura.getCidadeReferente().getEstado().getSigla();
            }

            texto.append("\t\t<ReferenteUFOrigem>").append(estadoReferente).append("</ReferenteUFOrigem>\n");

            texto.append("\t\t<ReferenteCidadeOrigem>").append(cidadeReferente).append("</ReferenteCidadeOrigem>\n");

            String cartorioReferente = "";

            if (escritura.getCartorioReferente() != null && !escritura.getCartorioReferente().isEmpty()) {
                cartorioReferente = escritura.getCartorioReferente();
            }

            texto.append("\t\t<ReferenteCartorio>").append(cartorioReferente).append("</ReferenteCartorio>\n");

            for (Parte parte : obterPartes(escritura)) {

                if (parte.getPessoa().getTipoPessoa() == TipoPessoa.FISICA) {

                    texto.append("\t\t<ParteNome>").append(parte.getPessoa().getNome()).append("</ParteNome>\n");

                    String identidade = "";

                    if (parte.getPessoa().getRg() != null && !parte.getPessoa().getRg().isEmpty()) {
                        identidade = Caracteres.removecaracter(parte.getPessoa().getRg());
                    }

                    texto.append("\t\t<ParteIdentidade>").append(identidade).append("</ParteIdentidade>\n");

                    String orgaoEmissor = "";

                    if (parte.getPessoa().getOrgaoEmissor() != null && !parte.getPessoa().getOrgaoEmissor().isEmpty()) {
                        orgaoEmissor = parte.getPessoa().getOrgaoEmissor();
                    }

                    texto.append("\t\t<ParteOrgaoEmissor>").append(orgaoEmissor).append("</ParteOrgaoEmissor>\n");

                    texto.append("\t\t<ParteTipoDocumento>").append("CPF").append("</ParteTipoDocumento>\n");

                    texto.append("\t\t<ParteNumeroDocumento>").append(Caracteres.removecaracter(parte.getPessoa().getCpf())).append("</ParteNumeroDocumento>\n");

                    texto.append("\t\t<ParteQualidade>").append(parte.getQualidade().getDescricao().toUpperCase()).append("</ParteQualidade>\n");

                } else {

                    texto.append("\t\t<ParteNome>").append(parte.getPessoa().getRazaoSocial()).append("</ParteNome>\n");

                    texto.append("\t\t<ParteTipoDocumento>").append("CNPJ").append("</ParteTipoDocumento>\n");

                    texto.append("\t\t<ParteNumeroDocumento>").append(Caracteres.removecaracter(parte.getPessoa().getCnpj())).append("</ParteNumeroDocumento>\n");

                    texto.append("\t\t<ParteQualidade>").append(parte.getQualidade().getDescricao().toUpperCase()).append("</ParteQualidade>\n");

                }

            }

            texto.append("\t</AtoCep>\n");
        }

        texto.append("</NewDataSet>");

        file.write(texto.toString());

        reader.close();
        file.close();
    }
}
